这个边界条件太多了。。。

1。一个是要考虑到INT_MAX和INT_MIN的情况,然后要想到INT_MIN是比INT_MAX的绝对值大的,所以不能够简单的,一碰到n<0,就算-n的情况。

然后还要考虑到n<0的情况下,用1去除,要保证除数不是0

还有1的几次方之类的,可以直接输出

还有一个很重要的点,就是考虑到x<0的时候,注意符号的问题

Implementpow(x,n), which calculates x_raised to the power_n(xn).

Example 1:

Input:
 2.00000, 10

Output:
 1024.00000

Example 2:

Input:
 2.10000, 3

Output:
 9.26100

Example 3:

Input:
 2.00000, -2

Output:
 0.25000

Explanation:
 2
-2
 = 1/2
2
 = 1/4 = 0.25

Note:

  • -100.0 < x < 100.0 n is a 32-bit signed integer, within the range [−231, 231 − 1]

class Solution {

public:

double myPow\(double x, int n\) {

    if\(\(n==0\)\|\|\(x==1\)\) return 1;

    if\(n==1\) return x;

    int flag=1;

    if \(x&lt;0\) {

        flag=\(n%2\)?-1:1;

        x=-x;

       // cout&lt;&lt;flag;

    }

    if \(n&lt;0\) {

        if \(n==INT\_MIN\){

            if \(x&gt;1\) return 0;

            if \(x&lt;1\) return INT\_MAX;

            if \(x==1\) return flag;

        }

        if \(myPow\(x,-n\)==0\) {

            return INT\_MAX;

        }

        else{

            return 1/myPow\(x,-n\);

        }

    }



    int i=1;

    double result=x;

    double past=0; 



    while \(i&lt;n\){

        past=result;

        if\(2\*i&lt;=n\){

            result=result\*result;

            i\*=2;

        }

        else{

            result=result\*x;

            i++;

        }

        if\(result==past\) break;

    }



    return result\*flag;



}

};

但是我这个版本的效率太低了

参考版本:

static int x = [](){

std::ios::sync\_with\_stdio\(false\);

cin.tie\(NULL\);

return 0;

}();

class Solution {

public:

double myPow\(double x, int n\) {

  if \(n == 0 \|\| x == 1\) return 1;

double t = myPow\(x, n / 2\);

if \(n % 2\)

    return n &lt; 0 ? 1.0 / x \* t \* t : x \* t \* t;

else

    return t \* t;



}

};

最开始的时候,是用递归的方式写的。但是有run time error,就以为不能用递归。。。

results matching ""

    No results matching ""